home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine CD 1995 / Archive Magazine CD 1995.iso / discs / prog_disc / volume_8 / issue_07 / std / !STDFinder / c / Search < prev    next >
Encoding:
Text File  |  1993-03-08  |  4.4 KB  |  147 lines

  1. /* Title:   search.c
  2.  * Purpose: Allow searching of STD codes or towns 
  3.  * Author:  Julyan Bristow
  4.  * Date:    23 September 1992
  5.  * Purpose: search routine for a structure
  6.  * Updated Feb '93 for use with doubly linked lists 
  7.  *   char : *search_for  - string to be searched against
  8.  *   exact: 1 for exact, 0 for approx/contains
  9.  */
  10.  
  11. #include "stdio.h"
  12. #include "stdlib.h"
  13. #include "string.h"
  14. #include "ctype.h"
  15. #include "werr.h"
  16. #define mtnl      50
  17. #define mcl       8
  18.  
  19. extern struct std {
  20.   char town[mtnl];
  21.   char code[mcl];
  22.   struct std *next;
  23.   struct std *previous;
  24.   } *stdstart,*stdlast;  
  25.  
  26. extern struct search {
  27.   char town[mtnl];
  28.   char code[mcl];
  29.   struct search *next;
  30.   struct search *previous;
  31.   } *srchstart,*srchlast;  
  32.  
  33. extern int found;
  34. int s_type,leading,trailing,wildcards;
  35.  
  36. /***************************** Define Search Routine *****************************/
  37. int string_search(char *search_for,int exact)
  38. {
  39.   char *string_to_lower(char *string),*remove_wildcards(char *string);
  40.   char find[mtnl];
  41.   int validate(char *string,int exact);
  42.   int exact_search(char *string,struct std *stdstart,struct search *srchstart,int s_type);
  43.   int general_search(char *string,struct std *stdstart,struct search *srchstart,int s_type,int lead,int trail);
  44.   struct search *srchnode;
  45.  
  46.   while (srchstart) {  /* free any existing search lists */
  47.     srchnode = srchstart->next;
  48.     free(srchnode);
  49.     srchstart = srchnode;
  50.     }
  51.  
  52.   if ((srchstart = (struct search *) 
  53.          calloc(1, sizeof(struct search))) == NULL)
  54.   { printf("Unable to assign memory for first search node.\n"); return NULL;} 
  55.  
  56.   leading = trailing = wildcards = 0;
  57.   if(validate(search_for,exact) == 0) return NULL;
  58.  
  59.   if (exact) strcpy(find,search_for);
  60.   else {
  61.     if (!wildcards) strcpy(find,string_to_lower(search_for));
  62.     else strcpy(find,remove_wildcards(search_for));
  63.     }
  64. /* now do the town searches */
  65.  
  66.   if (s_type) { /* do all the town searches */
  67.     if (exact) return exact_search(find,stdstart,srchstart,s_type);
  68.     else return general_search(find,stdstart,srchstart,s_type,leading,trailing);
  69.   }
  70.   else { /* the code searches */
  71.     if (exact) return exact_search(find,stdstart,srchstart,s_type);
  72.     else return general_search(find,stdstart,srchstart,s_type,leading,trailing);
  73.  }
  74.  return NULL;
  75. }
  76.  
  77. int exact_search(char *string,struct std *stdstart,struct search *srchstart,int s_type)
  78. {
  79.   struct std *stdnode;
  80.   struct search *srchnode,*p = NULL;
  81.   char match[mtnl];
  82.   int found = 0;
  83.   stdnode = stdstart; srchnode = srchstart;
  84.  
  85.   while(stdnode) {
  86.      if (s_type) strcpy(match,stdnode->town);
  87.      else strcpy(match,stdnode->code);
  88.      if(!strcmp(string,match)) {
  89.           if ((srchnode->next = (struct search *) calloc(1, sizeof(struct search))) == NULL)
  90.             { werr(0,"Unable to assign memory for next node.\n"); return NULL;}
  91.      strcpy(srchnode->town,stdnode->town); strcpy(srchnode->code,stdnode->code);
  92.      srchnode->previous = p; p = srchnode; srchnode = srchnode->next;
  93.      found++;
  94.      }
  95.   stdnode = stdnode->next;
  96.   }
  97.   if (found) {
  98.     p->next = NULL; srchlast = p; srchstart->previous = NULL;
  99.     return found;
  100.     }
  101.   return NULL;
  102. }
  103.  
  104. int general_search(char *string,struct std *stdstart,struct search *srchstart,int s_type,
  105.      int lead,int trail)
  106. {
  107.   struct std *stdnode;
  108.   struct search *srchnode,*p = NULL;
  109.   char *string_to_lower(char *string),match[mtnl],new_string[mtnl];
  110.   char *mod(char *string,int search_length);
  111.   int len,found = 0;
  112.   len = strlen(string);
  113.  
  114.   stdnode = stdstart; srchnode = srchstart;
  115.  
  116.   while(stdnode) {
  117.     if (s_type) {
  118.       if (lead || trail) { 
  119.         strcpy(new_string,string_to_lower(stdnode->town));
  120.         strcpy(match,mod(new_string,len));
  121.         }
  122.         else strcpy(match,string_to_lower(stdnode->town));
  123.      }
  124.      else {
  125.       if (lead || trail) { 
  126.         strcpy(new_string,string_to_lower(stdnode->code));
  127.         strcpy(match,mod(new_string,len));
  128.         }
  129.         else strcpy(match,stdnode->code);
  130.      }
  131.      if(strstr(match,string)) {
  132.           if ((srchnode->next = (struct search *) calloc(1, sizeof(struct search))) == NULL)
  133.             { werr(0,"Unable to assign memory for next node.\n"); return NULL;}
  134.      strcpy(srchnode->town,stdnode->town); strcpy(srchnode->code,stdnode->code);
  135.      srchnode->previous = p; p = srchnode; srchnode = srchnode->next;
  136.      found++;
  137.      }
  138.   stdnode = stdnode->next;
  139.   }
  140.   if (found) {
  141.     p->next = NULL; srchlast = p; srchstart->previous = NULL;
  142.     return found;
  143.     }
  144.   return NULL;
  145. }
  146.  
  147.